import os
import sys
import os
import shutil
from pathlib import Path
import subprocess

# 确保使用当前Python环境
sys.executable = sys.executable

def build_exe():
    # 项目根目录
    project_dir = os.path.dirname(os.path.abspath(__file__))
    
    # 清理之前的构建文件
    dist_dir = os.path.join(project_dir, 'dist')
    build_dir = os.path.join(project_dir, 'build')
    spec_file = os.path.join(project_dir, 'maipu_ai_coder_enchance.spec')
    
    if os.path.exists(dist_dir):
        shutil.rmtree(dist_dir)
    if os.path.exists(build_dir):
        shutil.rmtree(build_dir)
    if os.path.exists(spec_file):
        os.remove(spec_file)
    
    print("清理完成，开始构建EXE...")
    
    # PyInstaller命令构建参数
    pyinstaller_cmd = [
        sys.executable,
        '-m', 'PyInstaller',
        '--onefile',  # 生成单个EXE文件
        '--name', 'maipu_ai_coder_enchance',  # 输出文件名
        '--icon', os.path.join(project_dir, 'icon.ico'),  # 设置应用图标
        '--add-data', f'{os.path.join(project_dir, "ctags.exe")};.',  # 添加ctags.exe
        '--add-data', f'{os.path.join(project_dir, "cscope.exe")};.',  # 添加cscope.exe
        '--add-data', f'{os.path.join(project_dir, "readtags.exe")};.',  # 添加readtags.exe
        '--hidden-import', 'asyncio',  # 确保asyncio被包含
        '--hidden-import', 'uv',  # 确保uv被包含
        '--hidden-import', 'queue',  # 确保queue模块被包含
        '--hidden-import', 'fastmcp',  # 确保fastmcp被包含
        '--hidden-import', 'mcp',  # 确保mcp被包含
        '--hidden-import', 'mcp.server',  # 确保mcp.server被包含
        '--hidden-import', 'mcp.server.lowlevel',  # 确保mcp.server.lowlevel被包含
        '--hidden-import', 'mcp.server.lowlevel.server',  # 确保mcp.server.lowlevel.server被包含
        '--hidden-import', 'mcp.server.lowlevel.protocol',  # 确保mcp.server.lowlevel.protocol被包含
        '--hidden-import', 'mcp.server.lowlevel.transport',  # 确保mcp.server.lowlevel.transport被包含
        '--additional-hooks-dir', os.path.join(project_dir, 'hooks'),  # 使用自定义钩子目录
        '--collect-data', 'fastmcp',  # 收集fastmcp包的所有数据文件
        '--collect-submodules', 'importlib.metadata',  # 确保importlib.metadata模块被包含
        '--console',  # 显示控制台窗口，便于调试
        '--clean',  # 清理临时文件
        os.path.join(project_dir, 'maipu_ai_coder_enchance.py')  # 主脚本
    ]
    
    # 执行PyInstaller构建命令
    try:
        subprocess.run(pyinstaller_cmd, check=True, shell=False)
        print(f"\n构建成功！可执行文件位于：{dist_dir}")
        
        # 复制必要的资源文件到dist目录
        print("复制必要的资源文件...")
        
        # 检查是否需要复制requirements.txt（可选）
        requirements_src = os.path.join(project_dir, 'requirements.txt')
        requirements_dst = os.path.join(dist_dir, 'requirements.txt')
        if os.path.exists(requirements_src):
            shutil.copy2(requirements_src, requirements_dst)
            print(f"已复制 requirements.txt 到 {dist_dir}")
        
        # 提示用户构建完成
        print("\n======== 构建完成 ========")
        print(f"可执行文件: {os.path.join(dist_dir, 'maipu_ai_coder_enchance.exe')}")
        print("\n使用方法:")
        print("1. 将dist目录中的maipu_ai_coder_enchance.exe复制到目标机器")
        print("2. 确保目标机器上有需要分析的代码目录")
        print("3. 在命令行中运行: maipu_ai_coder_enchance.exe --vs_workspace_file your_workspace.code-workspace")
        print("\n注意事项:")
        print("- 应用会自动携带ctags.exe、cscope.exe和readtags.exe")
        print("- 无需在目标机器上安装Python")
        print("- 程序会在工作目录生成符号数据库文件")
    except subprocess.CalledProcessError as e:
        print(f"构建失败: {e}")
        sys.exit(1)
    
if __name__ == '__main__':
    # 检查是否已安装PyInstaller，如果没有则安装
    try:
        import PyInstaller
        print(f"已安装PyInstaller版本: {PyInstaller.__version__}")
    except ImportError:
        print("未找到PyInstaller，正在安装...")
        try:
            subprocess.run([sys.executable, '-m', 'pip', 'install', 'pyinstaller'], check=True)
            print("PyInstaller安装成功")
        except subprocess.CalledProcessError:
            print("PyInstaller安装失败，请手动安装后再运行此脚本")
            sys.exit(1)
    
    # 执行构建
    build_exe()